package com.hqx.processcontrol;

import java.util.Scanner;

/**
 * 数组的基本
 * @author hqx
 * @version 2021-6-21 v1.0
 */
public class ArrayTest {
    public static void main(String[] args) {
        test();
//        test2();
//        test3();
//        test4();
//        test5();
//        test6();
//        test7();
//        test8();
//        BubbleSort();
    }

    public static void test() {
        int[] a = new int[5];
//        System.out.println(a[3]); //a[3]默认的值为0
        char[] chars = new char[5];
//        System.out.println(chars[0]); //chars[0]的默认值为' '（空字符）
//        System.out.println(a[6]);
        int[][] arr = new int[5][];
        System.out.println(arr[0][1]);
    }

    /**
     * 从键盘读入学生成绩，找出最高分，
     * 并输出学生成绩等级。
     * 成绩>=最高分-10 等级为’A’
     * 成绩>=最高分-20 等级为’B’
     * 成绩>=最高分-30 等级为’C’
     * 其余 等级为’D’
     */
    public static void test2() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生的个数:");
        int stuNum = sc.nextInt();
        //根据输入的学生数初始化数组
        int [] stuArr = new int [stuNum];
        //录入每个学生的成绩
        for (int i = 0;i < stuArr.length;i++) {
            System.out.println("请输入学生"+(i+1)+"的成绩：");
            stuArr[i] = sc.nextInt();
        }
        //找出学生成绩中的最高分
        int maxScore = 0;
        for (int i = 0; i < stuArr.length;i++) {
            if(maxScore < stuArr[i]) {
                maxScore = stuArr[i];
            }
        }
        
        //判断学生成绩等级并输出
        char level;
        for (int i = 0; i < stuArr.length; i++) {
            if(maxScore - stuArr[i] <= 10) {
                level = 'A';
            } else if(maxScore - stuArr[i] <= 20) {
                level = 'B';
            } else if(maxScore - stuArr[i] <= 30) {
                level = 'C';
            } else {
                level = 'D';
            }

            System.out.println("Student "+(i+1)+" Score is "+stuArr[i]+" level is "+level);
        }
    }

    public static void test3() {
        String [][] arr3 = new String[3][]; // null
//        System.out.println(arr3[0][0]); //空指针异常
        //遍历二维数组
        int [] arr4[] = new int[][]{{1,2,3},{4,2,123,3}};
        for (int i = 0; i <arr4.length ; i++) {
            for (int j = 0; j <arr4[i].length ; j++) {
                System.out.println(arr4[i][j]);
            }
        }
    }

    public static void test4() {
        //初始化方式一:
//        int [][] arr = new int[4][5];
//        System.out.println(arr); // [[I@地址
//        System.out.println(arr[0]); //[I@地址
//        System.out.println(arr[0][1]); //0

        //初始化方式二:
        int [][] arr1 = new int[5][];
        System.out.println(arr1);// [[I@地址
        System.out.println(arr1[0]); // null
        System.out.println(arr1[0][1]); //空指针异常
    }

    /**
     * 输出10层的杨辉三角
     */
    public static void test5() {
        //声明初始化
        int [][] yh = new int[10][];
        //数组元素赋值
        for (int i = 0; i < yh.length; i++) {
            yh[i] = new int[i+1];
            yh[i][0] = 1;
            yh[i][i] = 1;

            //第三行开始，除了首尾，元素的值等于其上面的元素和上面的元素左边元素的和
            if(i>1) {
                for (int j = 1; j <yh[i].length - 1; j++) {
                    yh[i][j] = yh[i-1][j] + yh[i-1][j-1];
                }
            }
        }
        //遍历数组
        for (int i = 0; i <yh.length ; i++) {
            for (int j = 0; j < yh[i].length; j++) {
                System.out.print(yh[i][j]+" ");
            }
            System.out.println();
        }
    }


    /**
     * 定义一个int型的一维数组，包含10个元素，分别赋一些随机整数，
     * 然后求出所有元素的最大值，最小值，和值，平均值，并输出出来 。
     * 要求：所有随机数都是两位数。
     */

    public static void test6() {
        int[] arr = new int[10];
        int sum = 0;
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int)(Math.random() * (99 -10 + 1) + 10);
            System.out.print(arr[i] + " ");
            //求和
            sum += arr[i];

            //求最大值
            if(max < arr[i]) {
                max = arr[i];
            }

        }
        System.out.println();
        int min = arr[0];
        for (int i = 0; i < arr.length; i++) {
            //求最小值
            if(min > arr[i]) {
                min = arr[i];
            }
        }

        //求平均数
        double avg = sum / arr.length;

        System.out.println("最大值:"+max);
        System.out.println("最小值:"+min);
        System.out.println("和:"+sum);
        System.out.println("平均值:"+avg);


    }


    /**
     * 数组的复制和反转
     */
    public static void test7() {
        int [] arr = new int[]{1,5,4,7,2};
        //复制
        int [] arr2 = new int[arr.length];
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr[i];
            System.out.print(arr2[i] + "\t");
        }
        System.out.println();

        //反转
        for (int i = 0;i < arr.length / 2; i++) {
            int temp = arr[i];
            arr[i] = arr[arr.length - i - 1];
            arr[arr.length - i - 1] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }

    /**
     * 基本的查找(线性查找、二分法查找)
     * 二分查找的前提是数据排列是有序的
     */
    public static void test8() {
        int[] arr = new int[]{-98,-34,-5,15,29,38,69};

        int dest = -34;
        int head = 0; //初始的首索引
        int end = arr.length - 1; //初始的末索引
        boolean flag = true;
        while (head <= end) {
            int middle = (head + end) / 2;
            if(dest == arr[middle]) {
                System.out.println("找到了指定的元素，位置为:"+middle);
                flag = false;
                break;
            } else if(dest < arr[middle]) {
                end = middle - 1;
            } else {
                head = middle + 1;
            }
        }

        if (flag == false) {
            System.out.println("很遗憾，没有找到诶...");
        }
    }


    public static void BubbleSort(){
        int [] arr = new int[]{9,5,1,2,3,7,8};

        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j+1]) {
                    int temp = arr[j+1];
                    arr[j+1] = arr[j];
                    arr[j] = temp;
                }
            }
        }

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+"\t");
        }
    }

}
